package adsi.domain;

import java.util.*;
import adsi.utils.*;
import org.json.*;

public class Equipment implements JSONString {

    private long ID;
    private String tailNumber;
    private Calendar fechaAlta;
    private Calendar fechaBaja;
    private Calendar fechaDisponibilidad;
    private boolean Disponible;

    public Equipment() {
        //values of -1 means no valid value.
        ID = -1;
        tailNumber = null;
        fechaAlta = null;
        fechaBaja = null;
        fechaDisponibilidad = null;
        Disponible = false; //delivered equipment

    }

    public long getID() {
        return ID;
    }

    public void setID(long ID) throws EntityException {
        this.ID = ID;
    }

    public String getTailNumber() {
        return tailNumber;
    }

    public void setTailNumber(String tailNumber) throws EntityException {
        if (isTNFormatOK(tailNumber)) {
            this.tailNumber = tailNumber;
        } else {
            throw new EntityException("Error en el formato del Tail Number.");
        }
    }

    public static boolean isTNFormatOK(String tailNumber) {
        boolean res = false;
        //Tail Number must be exactly 6 chars long
        if (tailNumber.length() == 6) {
            char[] tmp = tailNumber.toCharArray();
            //Tail Number must be of the form "AA-aaa" where AA are letters
            //and aaa are alphanumeric characters.
            res = (Character.isLetter(tmp[0]) && Character.isLetter(tmp[1]) &&
                    tmp[2] == '-' && Character.isLetterOrDigit(tmp[3]) &&
                    Character.isLetterOrDigit(tmp[4]) && Character.isLetterOrDigit(tmp[5]));
        }
        return res;
    }

    public Calendar getFechaAlta() {
        return fechaAlta;
    }

    public void setFechaAlta(Calendar fechaAlta) throws EntityException {
        this.fechaAlta = fechaAlta;
    }

    public Calendar getFechaBaja() {
        return fechaBaja;
    }

    public void setFechaBaja(Calendar fechaBaja) throws EntityException {
        if (fechaBaja != null) {
            if (fechaDisponibilidad != null) {
                if (fechaBaja.before(fechaDisponibilidad)) {
                    throw new EntityException("La fecha de baja no puede ser anterior a la fecha de disponibilidad.");
                }
            } else {
                throw new EntityException("El equipo debe contar con una fecha de disponibilidad para asignarle fecha de baja.");
            }
        }
        this.fechaBaja = fechaBaja;
    }

    public Calendar getFechaDisponibilidad() {
        return fechaDisponibilidad;
    }

    public void setFechaDisponibilidad(Calendar fechaDisponibilidad) throws EntityException {
        if (fechaDisponibilidad != null) {
            if (Disponible) {
                if (fechaAlta == null) {
                    this.fechaAlta = DateTime.getToday();
                }
                if (fechaDisponibilidad.before(fechaAlta)) {
                    throw new EntityException("La fecha de disponibilidad no puede ser anterior a la fecha de alta.");
                }
            } else {
                throw new EntityException("El equipo tiene que ser entregado para estar disponible.");
            }
        }
        this.fechaDisponibilidad = fechaDisponibilidad;
    }

    public boolean isDisponible() {
        return Disponible;
    }

    public void setDisponible(boolean Disponible) throws EntityException {
        if (fechaDisponibilidad == null) {
            this.Disponible = Disponible;
        } else if (Disponible && fechaDisponibilidad != null && fechaDisponibilidad.after(DateTime.getToday())) {
            this.Disponible = false;
            this.fechaDisponibilidad = null;
            this.fechaBaja = null;
        } else {
            throw new EntityException("El equipo ya está programado.");
        }
    }

    public String toJSONString() {
        return "{\"id\" : \"" + ID + "\", \"tail-number\" : \"" + tailNumber +
                "\", \"created-date\" : \"" + DateTime.calToString(fechaAlta) +
                "\", \"drop-date\" : \"" + DateTime.calToString(fechaBaja) +
                "\", \"available-date\" : \"" + DateTime.calToString(fechaDisponibilidad) +
                "\", \"delivered\" : \"" + Disponible +
                "\"}";
    }
}
